package net.imagine.core;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * <pre>
 * 图片操作模板基类，使用时必须设置图片操作接口operations
 * 所有图片操作模板必须实现该类的 {@link #resizeImage(String, ImageProcessTask)}方法
 * </pre>
 * 
 * @author wuqh
 */
public abstract class ImageProcessTemplate {
	private static final Log logger = LogFactory.getLog(ImageProcessTemplate.class);
	@Autowired
	protected ImageOperations operations;
	// 由于无法通过提前知道Qualifier 必须使用xml配置
	protected ImageProcessTemplate nextProcessor;

	/**
	 * 设置图片操作接口
	 */
	public void setOperations(ImageOperations operations) {
		this.operations = operations;
	}

	/**
	 * 设置下一步操作
	 */
	public void setNextProcessor(ImageProcessTemplate nextProcessor) {
		this.nextProcessor = nextProcessor;
	}

	/**
	 * 处理一张图片
	 * 
	 * @param imagePath
	 *            本地存放图片的目录。如果图片不上传到分布式文件系统的话，最终图片也将存放于此
	 * @param processTask
	 *            处理任务
	 * 
	 * @return 图片处理结果
	 */
	public abstract <T extends ImageProcessResult> T processImage(String imagePath, ImageProcessTask processTask)
			throws IOException;
	
	/**
	 * 产生一个文件对象
	 * 
	 * @param filePath
	 *            文件的本地原始路径（默认）
	 * 
	 * @return 文件对象
	 */
	protected File generateFile(String filePath) {
		File dir = new File(FilenameUtils.getFullPath(filePath));
		if (!dir.exists()) {
			boolean success = dir.mkdirs();
			if (!success && !dir.exists()) {
				logger.warn("mkdirs :" + dir + " failed");
			}
		}
		return new File(filePath);
	}
}